import axios from "axios";
import { ElMessage } from "element-plus";

/**
 * @type {string} API 基础地址
 */

// 创建axios实例
const api = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 10000,
  headers: {
    "Content-Type": "application/json",
  },
});

// 不需要token的API路径
const publicApis = ["/auth/login", "/auth/register", "/auth/refresh-token"];

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    console.log(
      "发送请求:",
      config.method?.toUpperCase(),
      config.url,
      config.data
    );

    // 检查是否是公开API（不需要token）
    const isPublicApi = publicApis.some((api) => config.url?.includes(api));

    if (isPublicApi) {
      console.log("公开API，不需要token:", config.url);
      return config;
    }

    // 从localStorage获取token
    const token = localStorage.getItem("token");
    console.log("当前token:", token ? "存在" : "不存在");

    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
      console.log(
        "设置Authorization头:",
        `Bearer ${token.substring(0, 20)}...`
      );
    } else {
      console.log("未找到token，请求将不包含Authorization头");
    }

    return config;
  },
  (error) => {
    console.error("请求错误:", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    console.log("收到响应:", response.status, response.data);

    // 对于文件下载，直接返回响应
    if (response.config.responseType === "blob") {
      console.log("文件下载响应，直接返回");
      return response;
    }

    // 如果响应成功，检查后端统一响应格式
    const data = response.data;
    console.log("响应数据格式检查:", {
      isObject: typeof data === "object",
      hasIsSuccess: data && "IsSuccess" in data,
      isSuccess: data?.IsSuccess,
      message: data?.Message,
    });

    if (
      data &&
      typeof data === "object" &&
      ("IsSuccess" in data || "Success" in data)
    ) {
      // 后端使用统一响应格式
      const isSuccess =
        data.IsSuccess !== undefined ? data.IsSuccess : data.Success;
      if (isSuccess) {
        console.log("后端返回成功，数据:", data.Data);
        return data.Data || data;
      } else {
        // 如果后端返回失败，抛出错误
        console.log("后端返回失败:", data.Message);
        const error = new Error(data.Message || "请求失败");
        error.response = { data: data };
        throw error;
      }
    }
    // 如果不是统一格式，直接返回数据
    console.log("非统一格式响应，直接返回数据");
    return data;
  },
  (error) => {
    console.error("响应错误:", error.response);
    // 处理错误响应
    if (error.response) {
      const { status, data } = error.response;

      switch (status) {
        case 400:
          ElMessage.error(data?.message || "请求参数错误");
          break;
        case 401:
          console.log("收到401错误，当前路径:", window.location.pathname);
          console.log("401错误详情:", {
            url: error.config?.url,
            method: error.config?.method,
            headers: error.config?.headers,
            responseData: error.response?.data,
          });

          // 分析401错误的原因
          const responseData = error.response?.data;
          if (
            responseData &&
            typeof responseData === "object" &&
            "Message" in responseData
          ) {
            console.log("后端返回的401错误信息:", responseData.Message);
          }

          // 检查是否是用户管理相关的API调用
          const isUserManagementApi = error.config?.url?.includes("/user/");
          const isAuthApi = error.config?.url?.includes("/auth/");

          if (isUserManagementApi) {
            // 对于用户管理API的401错误，可能是权限不足或用户状态问题
            console.log("用户管理API 401错误，可能是权限问题或用户状态问题");
            ElMessage.error("操作失败：权限不足或账户状态异常");
            return Promise.reject(error);
          }

          if (isAuthApi) {
            // 对于认证API的401错误，可能是登录失败
            console.log("认证API 401错误，登录失败");
            ElMessage.error("登录失败：用户名或密码错误");
            return Promise.reject(error);
          }

          // 其他API的401错误，可能是token过期或无效
          console.log("其他API 401错误，可能是token过期");
          ElMessage.error("登录已过期，请重新登录");
          localStorage.removeItem("token");
          localStorage.removeItem("userInfo");

          // 只有在非登录页面才跳转，避免在登录页面时重复跳转
          if (
            window.location.pathname !== "/login" &&
            window.location.pathname !== "/register"
          ) {
            console.log("跳转到登录页面");
            window.location.href = "/login";
          } else {
            console.log("当前已在登录页面，不进行跳转");
          }
          break;
        case 403:
          ElMessage.error("权限不足，无法执行此操作");
          break;
        case 404:
          ElMessage.error("请求的资源不存在");
          break;
        case 409:
          ElMessage.error("数据冲突：" + (data?.message || "资源已存在"));
          break;
        case 422:
          ElMessage.error(
            "数据验证失败：" + (data?.message || "输入数据格式不正确")
          );
          break;
        case 500:
          ElMessage.error("服务器内部错误，请稍后重试");
          break;
        case 502:
          ElMessage.error("网关错误，请稍后重试");
          break;
        case 503:
          ElMessage.error("服务暂时不可用，请稍后重试");
          break;
        default:
          ElMessage.error(data?.message || `请求失败 (${status})`);
      }
    } else if (error.request) {
      ElMessage.error("网络连接失败");
    } else {
      ElMessage.error("请求配置错误");
    }

    return Promise.reject(error);
  }
);

export default api;
